/**
 * 查找众数及中位数
 *
 * 众数是指一组数据中出现次数量多的那个数，众数可以是多个
 * 中位数是指把一组数据从小到大排列，最中间的那个数，如果这组数据的个数是奇数，那最中间那个就是中位数，
 * 如果这组数据的个数为偶数，那就把中间的两个数之和除以2，所得的结果就是中位数
 * 查找整型数组中元素的众数并组成一个新的数组，求新数组的中位数
 *
 * 输入描述:
 * 输入一个一维整型数组，数组大小取值范围 0<N<1000，数组中每个元素取值范围 0<E<1000
 * 输出描述:
 * 输出众数组成的新数组的中位数
 *
 * 示例1：
 * 输入
 * 10 11 21 19 21 17 21 16 21 18 15
 * 输出
 * 21
 *
 * 示例2：
 * 输入
 * 2 1 5 4 3 3 9 2 7 4 6 2 15 4 2 4
 * 输出
 * 3
 *
 * 示例3：
 * 输入
 * 5 1 5 3 5 2 5 5 7 6 7 3 7 11 7 55 7 9 98 9 17 9 15 9 9 1 39
 * 输出
 * 7
 */

// 求解众数
function mode(arr) {
  let map = new Map();
  let max = 0;
  for (let i = 0; i < arr.length; i++) {
    let count = (map.get(arr[i]) || 0) + 1;
    max = Math.max(max, count);
    map.set(arr[i], count);
  }
  let keys = map.keys();
  let newArr = [];
  for (let key of keys) {
    if (map.get(key) === max) {
      newArr.push(key);
    }
  }
  return newArr;
}

/**
 * 中位数
 * @param {array} arr
 * @returns number
 */
function median(arr) {
  arr = arr.sort((a, b) => a - b);
  if (arr.length % 2 === 0) {
    return (arr[arr.length / 2 - 1] + arr[arr.length / 2]) / 2;
  } else {
    return arr[parseInt(arr.length / 2)];
  }
}

console.log(median(mode([10, 11, 21, 19, 21, 17, 21, 16, 21, 18, 15])));
console.log(median(mode([2, 1, 5, 4, 3, 3, 9, 2, 7, 4, 6, 2, 15, 4, 2, 4])));

console.log(
  median(
    mode([
      5,
      1,
      5,
      3,
      5,
      2,
      5,
      5,
      7,
      6,
      7,
      3,
      7,
      11,
      7,
      55,
      7,
      9,
      98,
      9,
      17,
      9,
      15,
      9,
      9,
      1,
      39,
    ])
  )
);
